<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>
</head>
<body>
<script>
  // function Shape(args) {
  //   this.x = 0;
  //   this.y = 0;
  //   this.args = args;
  //   this.shapeMove = function () {
  //     console.log('Shape shapeMove.');
  //   };
  // }
  //
  // Shape.prototype.move = function (x, y) {
  //   this.x += x;
  //   this.y += y;
  //   console.log('Shape moved.');
  // };
  //
  // function Person(args) {
  //   this.className = 'Person';
  //   this.args = args;
  // }
  //
  // Person.prototype.run = function () {
  //   console.log('run: ', this.args);
  // };
  //
  // function Sub(args) {
  //   Shape.call(this, args);
  //   Person.call(this, args);
  // }
  //
  // Sub.prototype = Object.create(Shape.prototype);
  // Object.assign(Sub.prototype, Person.prototype);
  // Sub.prototype.constructor = Sub;
  //
  // let sub = new Sub('子类传递的参宿');
  // console.log(sub);
  // sub.shapeMove(1, 2);
  // sub.move(1, 2);
  // console.log(sub.args);
  // console.log(sub.className);
  // console.log(sub instanceof Shape);
  // console.log(sub instanceof Sub);
  // sub.run();

  // console.log('--------------------------------------------------------------------------------');

  // var o = Object.create(null);
  // console.log(o);
  //
  // o = Object.create(Object.prototype);
  // console.log(o);
  //
  // o = Object.create(Object.prototype, {
  //   foo: {
  //     writable: true,
  //     configurable: true,
  //     value: 'foo',
  //   },
  //   bar: {
  //     configurable: false,
  //     get() {
  //       return '18';
  //     },
  //     set(v) {
  //       console.log('bar set', v);
  //     },
  //   },
  // });
  // console.log(o);
  // console.log(o.foo);
  // console.log(o.bar);
  // o.bar = 111;
  // console.log(o.bar);
  // o.bar = { name: 'resset' };
  // console.log(o.bar);

  // -------------------------------------------------------------------------
  function Constructor(args) {
    this.className = 'Constructor';
    this.args = args;
  }

  Constructor.prototype.show = function () {
    console.log('show.............', this.args);
  };

  function Sub(args) {
    Constructor.call(this, args);
  }

  // var o = new Constructor();
  // 上面的一句就相当于:
  // var o = Object.create(Constructor.prototype);
  // o.show();

  // Sub.prototype = Object.create(Constructor.prototype);
  Sub.prototype = new Constructor();

  var sub1 = new Sub('sub');
  sub1.show();
  console.log(sub1.className);


</script>
</body>
</html>
